package utility

import (
	"strings"
	"time"

	"github.com/golang-jwt/jwt/v4"
)

var JWT = jwtUtil{
	secret: []byte("myapi-jwt-secret"),
	expire: 7 * 24 * time.Hour,
}

type jwtUtil struct {
	secret []byte
	expire time.Duration
}

// Generate 生成令牌（userID为整数类型，如10086）
func (u *jwtUtil) Generate(userID int) (string, error) {
	claims := jwt.MapClaims{
		"user_id": userID, // 存储为整数
		"exp":     time.Now().Add(u.expire).Unix(),
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString(u.secret)
}

// Validate 验证令牌并解析整数类型的userID
func (u *jwtUtil) Validate(tokenString string) (int, bool) {
	// 步骤1：移除可能存在的Bearer前缀（不区分大小写）
	tokenString = strings.TrimSpace(tokenString) // 先去除首尾空格
	//if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") {
	//	// 截取"bearer "之后的部分（7个字符："bearer "是6个字母+1个空格）
	//	tokenString = tokenString[7:]
	//}
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		return u.secret, nil
	})
	if err != nil || !token.Valid {
		return 0, false
	}
	claims, ok := token.Claims.(jwt.MapClaims)
	if !ok {
		return 0, false
	}

	// JWT中数字默认存储为float64，需先转为float64再转为int
	userIDFloat, ok := claims["user_id"].(float64)
	if !ok {
		return 0, false
	}

	return int(userIDFloat), true // 安全转换为int
}
